package com.wjm.api;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Arrays;

/**
 * Data:2022年08月15日
 * Author:wjm
 * Content: RandomAccessFile的实际使用的演示
 *
 *   可用于服务器用来接收客户端发送过来的数据(比如登入，注册)，对这些数据进行读写操作
 *
 */
public class RandomAccessFileDemo1 {
    public static void main(String[] args) {
        File file = new File("user.txt");
        System.out.println("写入之前文件长度："+file.length());
        writeData(file);
        System.out.println("写入之后文件长度："+file.length());
        System.out.println("---------------------------------------");
        readData(file);

    }

    //写入数据
    public static void writeData(File file){
        try(RandomAccessFile randomAccessFile = new RandomAccessFile(file,"rw");) {
            String username = "张三";
            String password = "123456";
            String sex = "男";
            //使用包装类的拆装箱机制将String转化为int类型
            int age = Integer.valueOf("18");

            //写入数据之前，都要将指针移动到文件末尾，这样做的就是拼接，而不是覆盖
            randomAccessFile.seek(file.length());


            /*
                 给每个用户的所包含的数据都分配100个字节的空间，不然每个用户所包含的数据长度都不一样，在后续的读取的中不好操作。
                 给username分配32个字节，password分配32字节，sex分配32字节，age分配4字节
                 将username，password，sex都放在byte[]数组中，无论byte数组是否放满，最后都进行扩容到32字节的长度
                 因为已经将age转成int类型，所有他本身就是4个字节不需要用byte数组存储

            */
            //将字符串转化为byte数组
            byte[] bytes = username.getBytes("utf-8");
            //对数组进行扩容到32字节长度
            bytes = Arrays.copyOf(bytes,32);
            //将username写入到user.txt文件中
            randomAccessFile.write(bytes);

            //将字符串转化为byte数组
            bytes = password.getBytes("utf-8");
            //对数组进行扩容到32字节长度
            bytes = Arrays.copyOf(bytes,32);
            //将password写入到user.txt文件中
            randomAccessFile.write(bytes);

            //将字符串转化为byte数组
            bytes = sex.getBytes("utf-8");
            //对数组进行扩容到32字节长度
            bytes = Arrays.copyOf(bytes,32);
            //将sex写入到user.txt文件中
            randomAccessFile.write(bytes);

            //将age写入到user.txt文件中
            randomAccessFile.writeInt(age);




        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //读出数据
    public static void readData(File file){
        try(RandomAccessFile randomAccessFile = new RandomAccessFile(file,"r");) {
            //创建一个字节长度为32字节的字节数组
            byte[] bytes = new byte[32];
            //因为一个用户的所有数组都是100字节，所以文件的长度/100就是用户的个数
            for(int i=0;i< file.length()/100;i++){
                //读取username
                randomAccessFile.read(bytes);
                //将字节数组转化为字符串
                String username = new String(bytes,"utf-8");

                //读取password
                randomAccessFile.read(bytes);
                //将字节数组转化为字符串
                String password = new String(bytes,"utf-8");

                //读取sex
                randomAccessFile.read(bytes);
                //将字节数组转化为字符串
                String sex = new String(bytes,"utf-8");

                //读取age
                int age = randomAccessFile.readInt();

                System.out.println("username:"+username);
                System.out.println("password:"+password);
                System.out.println("sex:"+sex);
                System.out.println("age:"+age);

            }


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }


}
